package cn.edu.zpark.security.springmvc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

/**
 * @PackageName: cn.edu.zpark.security.springmvc.config
 * @ClassName: WebSecrityConfig
 * @Description:
 * @author: RZS
 * @date: 2021/7/20  16:35
 */
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    // 定义用户信息服务（查询用户信息）
    @Bean
    public UserDetailsService userDetailsService(){
        // 自定义用户数据，后期改为从数据库获取即可
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("123").authorities("p2").build());
        return manager;
    }

    // 密码编码器
    @Bean
    public PasswordEncoder passwordEncoder(){
        // 返回指定的密码比对方式，这里使用明文比对
        return NoOpPasswordEncoder.getInstance();
    }

    // 安全拦截机制（重点）

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/r/r1").hasAuthority("p1") // 设置/r/r1路径访问的权限为p1
                .antMatchers("/r/r2").hasAuthority("p2") // 设置/r/r2路径访问的权限为p2
                .antMatchers("/r/**").authenticated() // 所有以/r开头的请求路径都必须要认证通过
                .anyRequest().permitAll() // 除了/r/**请求路径，其他的请求均可以访问，不需要认证
                .and()
                .formLogin() // 允许表单登录
                .successForwardUrl("/login-success");// 自定义登录成功的页面地址
    }
}
